
#include "sockLib.h"

/******************************************************************************
* FUNCION: MKSOCKET()																*
* DESCRIPCION: Crea un socket servidor o cliente del tipo AF_INET					*
* DEVUELVE: Si hubo error devuelve -1												*
*				Si se conecto con exito devuelve el socket							*
******************************************************************************/

int mksocket(int mode, struct in_addr ip,int puerto, struct sockaddr_in *myAddr)
{
	socklen_t serverSize;
	int sockfd;
	int yes=1;

	myAddr = malloc(sizeof(struct sockaddr_in));

	/* Inicializacion y creacion del socket AF_INET para esperar personas */
	bzero(&(myAddr->sin_zero),8);
	myAddr->sin_family = AF_INET;
	myAddr->sin_port = puerto;

	if(mode == SERVER ){
		myAddr->sin_addr.s_addr = INADDR_ANY;
	}else{
		myAddr->sin_addr = ip;
	}

	sockfd = socket(AF_INET, SOCK_STREAM, 0);
	if (sockfd < 0){
        	printf("No se pudo crear el sockets/n");
		return -1;
	}
	if (setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(int))<0){
		printf("Error en setsockopt/n");
		close(sockfd);
		return -1;
	}

	serverSize = sizeof(struct sockaddr_in);

	switch(mode){
		case CLIENT:
			if(connect(sockfd,(struct sockaddr *)myAddr,serverSize) < 0) {
				perror("connect");
				close(sockfd);
				return -1;
			}
		break;

		case SERVER:
			if((bind(sockfd,(struct sockaddr *)myAddr, serverSize))<0){
				printf("Error en el bind/n");
				close(sockfd);
				return -1;
			}

			if ((listen(sockfd, 100)) < 0) {
				perror("Error en el listen/n");
				close(sockfd);
				return -1;
			}
			printf("Escuchando\n");
		break;
	}

	return sockfd;
}



int enviarPorSocket(int fd, T_MENSAJE* mensaje)
{
	char buffer[mensaje->length + 3];

	// Envía solicitud
	memcpy(buffer,mensaje,3);
	if(mensaje->length > 0)
		memcpy(buffer+3,mensaje->mensaje,mensaje->length);

	if(send(fd, buffer, mensaje->length + 3, 0) == -1) {
		//logERROR("HTTP SERVER","No se pudo crear Hilo de solicitud");
		return -1;
	}

	return 0;
}


int recibirDeSocket(int fd, T_MENSAJE** respuesta)
{
	int bufsize;
	//char * buffer;

	// Recibe la cabecera
	*respuesta = malloc(sizeof(T_MENSAJE));
	bufsize = recv(fd,*respuesta,3,MSG_WAITALL);

	if(bufsize < 0) {
		//logERROR("HTTP SERVER","No se pudo crear Hilo de solicitud");
		perror("recv");
		return -1;
	}

	if((*respuesta)->length > 0) {
		(*respuesta)->mensaje = malloc((*respuesta)->length);

		// Recibe el payload
		bufsize = recv(fd,(*respuesta)->mensaje,(*respuesta)->length,MSG_WAITALL);

		if(bufsize < 0) {
			//logERROR("HTTP SERVER","No se pudo crear Hilo de solicitud");
			perror("recv2");
			return -1;
		}
	}

	return 0;
}
/*
int recibirDeSocket(int fd, T_MENSAJE** respuesta)
{
	int bufsize=516+3;
	char * buffer;

	buffer = malloc(bufsize);

	bufsize = recv(fd,buffer,bufsize,0);
	if(bufsize == -1) {
		//logERROR("HTTP SERVER","No se pudo crear Hilo de solicitud");
		return -1;
	} else {
		*respuesta = decodificarMensaje(buffer);
		free(buffer);
	}

	return 0;
}
*/
